﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using vensoft.Entities;

namespace vensoft.DataAccess
{
    public class PedidoDataAccess : MasterDataAcess,IPedidoDataAccess
    {
        public PedidoDataAccess()
            :base()
        { }

        public void RegistrarPedido(Pedido pedido)
        {
            IDetallePedidoDataAccess detalleDAL = new DetallePedidoDataAccess(this);

            SqlCommand comando = base.CreateCommand("RegistrarPedido");

            SqlParameter paramet = comando.CreateParameter();
            paramet.ParameterName = "Cod_Pedido";
            paramet.Direction = ParameterDirection.InputOutput;
            paramet.Value = pedido.Id;

            comando.Parameters.Add(paramet);

            base.AddInParameter(comando, "Fecha_Pedido", pedido.Fecha);
            base.AddInParameter(comando, "Cod_Proveedor", pedido.ProveedorId);
            base.AddInParameter(comando, "Raz_Soc", pedido.Raz_soc);
            base.AddInParameter(comando, "Cod_Personal", pedido.PersonalId);
            base.AddInParameter(comando, "Nombre_Pers", pedido.Nombre_Pers);
            base.AddInParameter(comando, "Total", pedido.Total);

            base.ExecuteCommand(comando);
            pedido.Id = Int32.Parse(paramet.Value.ToString());
            detalleDAL.RegistrarDetalle(pedido.Detalle, pedido.Id);
        }

        public void ActualizarStock(Int32 id_producto, int cantidad)
        {
            SqlCommand command = base.CreateCommand("ActualizarStockPedido");
            base.AddInParameter(command, "Id_Producto", id_producto);
            base.AddInParameter(command, "Cantidad", cantidad);

            base.ExecuteCommand(command);
        }

        public List<Pedido> GetAllFromPedido()
        {
            SqlCommand comando = base.CreateSelectCommand("GetAllFromPedido");
            return SelectObjectFactory(comando);
        }

        private List<Pedido> SelectObjectFactory(SqlCommand comando)
        {
            List<Pedido> lista = new List<Pedido>();

            using (SqlDataReader reader = base.ExecuteReader(comando))
            {
                while (reader.Read())
                {
                    Pedido pedido = new Pedido()
                    {
                        Id = reader.GetInt32(0),
                        Fecha = reader.GetDateTime(1),
                        ProveedorId = reader.GetInt32(2),
                        Raz_soc = reader.GetString(3),
                        PersonalId = reader.GetInt32(4),
                        Nombre_Pers = reader.GetString(5),
                        Total = reader.GetDecimal(6)
                    };

                    lista.Add(pedido);
                }
            }

            return lista;
        }

        public List<Pedido> GetAllFromPedidoByFechas(DateTime f_inicio, DateTime f_fin)
        {
            SqlCommand command = base.CreateSelectCommand("GetAllFromPedidoByFecha");
            command.Parameters.AddWithValue("f_inicio", f_inicio);
            command.Parameters.AddWithValue("f_fin", f_fin);
            return SelectObjectFactory(command);
        }

        public List<Pedido> GetAllFromPedidoByNombPers(string nomb_pers)
        {
            SqlCommand command = base.CreateSelectCommand("GetAllFromPedidoByNombPers");
            command.Parameters.AddWithValue("nomb_pers", nomb_pers);            
            return SelectObjectFactory(command);
        }

        public List<Pedido> RetornarPedidoNoIngresado()
        {
            SqlCommand command = base.CreateSelectCommand("RetornarPedidoNoIngresado");
            return SelectObjectFactory(command);
        }

        public List<Pedido> RetornarPedidoNoIngresadoByFechas(DateTime f_inicio, DateTime f_fin)
        {
            SqlCommand command = base.CreateSelectCommand("GetFromPedidoByFechasNoIngresado");
            command.Parameters.AddWithValue("f_inicio", f_inicio);
            command.Parameters.AddWithValue("f_fin", f_fin);
            return SelectObjectFactory(command);
        }
        
        public List<Pedido> RetornarPedidoNoIngresadoByNombPers(string nomb_pers)
        {
            SqlCommand command = base.CreateSelectCommand("GetFromPedidosByNombPersNoActivados");
            command.Parameters.AddWithValue("nomb_pers", nomb_pers);
            return SelectObjectFactory(command);
        }
        
        public void IngresarPedido(int cod_ped)
        {
            SqlCommand command = base.CreateCommand("IngresarPedido");
            base.AddInParameter(command, "cod_pedido", cod_ped);           

            base.ExecuteCommand(command);
        }
    }
}
